package org.stars.daostars.starterkit;
 
import java.io.Serializable;
import java.sql.Timestamp;

import org.stars.daostars.EntityBean;
import org.stars.util.reflect.BeanUtil;

/**
 * E' la classe base degli entity bean. Ogni entity bean deve derivare da questa classe. Contiene tutti gli attributi e
 * i metodi comuni agli entity bean.
 * <p>
 * Rappresenta la classe base di tutte le entit� di base che il framework <code>DaoStars</code> pu� 
 * rendere persistente. Il metodo <b>reset</b> serve invece ad impostare tutti gli
 * attributi ai rispettivi valori di default.<p>Ogni entityBean deve:
 * <ul>
 * <li><b>implementare il metodo <code>reset</code></b> richiamando come prima cosa il reset
 * della classe padre e di seguito inizializzando tutti gli attributi che sono stati definiti.
 * Gli attributi definiti a livello di classi padre sono inizializzati a livello di classe padre.
 * Un esempio di implementazione del metodo reset:<br><br>
 *  <code><pre>
 *	public void reset() {
 *		super.reset();
 *		setCognome(DEFAULT_STRINGA);
 *		setNome(DEFAULT_STRINGA);
 *		setDataNascita(null);
 *		setCodiceFiscale(DEFAULT_STRINGA);
 *		setLuogoId(DEFAULT_ID);
 *		setLuogoDescrizione(DEFAULT_STRINGA);
 *		setPersonaFisicaId(DEFAULT_ID);
 *	}
 *  </pre></code><br></li>
 *  <li><b>Non deve implementare il costruttore</b> in quanto viene ereditato il costruttore dell'entityBeanBase
 *  che esegue il <code>reset</code>.</li>
 * </ul>
 * 
 * @author Alex Svetina (908303)
 * @author Francesco Benincasa (908099)
 * @version 1.1, 18/10/2006
 *
 */ 
public class EntityBeanBase implements EntityBean, Cloneable, Serializable
{
    public final static long DEFAULT_ID = -1L;
    public final static short	DEFAULT_NUMBER	= 0;
    public final static String DEFAULT_STRINGA = "";    
    public final static int DEFAULT_NEG = -1;
    	
	/**
	 * Dato un id, restitiusce <code>true</code> se l'id ha un valore valido,
	 * <code>false</code> altrimenti. L'id passato come parametro risulta
	 * essere valido se e solo se è diverso da <code>null</code> e dal valore
	 * <code>DEFAULT_ID</code> (impostato a -1L).
	 * 
	 * @param id
	 * 			valore da analizzare
	 * @return
	 * 			<code>true</code> se l'id è valido, <code>false</code> altrimenti.
	 */
	public static boolean isIdValido(Long id)
	{
        return id != null && id != DEFAULT_ID;

    }
		
	/**
	 * Analizza l'id dell'entity bean per vedere se � valido o meno. Restituisce
	 * <code>true</code> se l'id � valido, <code>false</code> altrimenti.
	 * 
	 * @return
	 * 		<code>true</code> se l'id � valido, <code>false</code> altrimenti.
	 */
	public boolean hasIdValido()
	{
		return isIdValido(id);
	}
	
	/**
	 * Serial id
	 */
	private static final long serialVersionUID = 7639725700993968144L;

	@Override
	public Object clone() throws CloneNotSupportedException
    {
	    try {
		  return super.clone(); 
	    } catch (CloneNotSupportedException e) { // Dire trouble!!!
	         throw new InternalError("Oggetto non clonabile!!");
	    }
	  }

    @Override
    public String toString()
    {
        return BeanUtil.inspectBean(this);
    }

    
    /**
	 * Data ultimo aggiornamento
	 */
	protected Timestamp dataAggiornamento; // Data ultimo Agg.
	
	/**
	 * username dell'utente che ha effetuato l'aggiornamento
	 */
	protected String utenteAggiornamento; // Utente ultimo agg
		
	/**
	 * terminaleAggiornamento da cui viene effettuato l'aggiornamento
	 */
	protected String terminaleAggiornamento; // terminale
    
    /**
     * Id dell'entityBean
     */
    protected Long id;

    /**
     * Costruttore. Inizializza il bean con i valori di default
     */
    public EntityBeanBase()
    {
    	reset();
    }
    
    /* (non-Javadoc)
     * @see it.insiel.personale.core.EntityBean#reset()
     */
    public void reset()
    {
        setDataAggiornamento(null);
        setUtenteAggiornamento(null);
        setTerminaleAggiornamento(null);
        setId(DEFAULT_ID);
    }

    /**
     * getter DataAggiornamento
     * @return dataAggiornamento
     */
    public Timestamp getDataAggiornamento()
    {
        return dataAggiornamento;
    }

    /**
     * setter DataAggiornamento
     * @param dataAggiornamento data Aggiornamento
     */
    public void setDataAggiornamento(Timestamp dataAggiornamento)
    {
        this.dataAggiornamento = dataAggiornamento;
    }

    /**
     * getter terminaleAggiornamento
     * @return terminaleAggiornamento
     */
    public String getTerminaleAggiornamento()
    {
        return terminaleAggiornamento;
    }

    /**
     * setter terminaleAggiornamento
     * @param terminaleAggiornamento terminaleAggiornamento
     */
    public void setTerminaleAggiornamento(String terminaleAggiornamento)
    {
        this.terminaleAggiornamento = terminaleAggiornamento;
    }

    /**
     * getter utenteAggiornamento
     * @return utenteAggiornamento
     */
    public String getUtenteAggiornamento()
    {
        return utenteAggiornamento;
    }

    /**
     * setter utenteAggiornamento
     * @param utenteAggiornamento utenteAggiornamento
     */
    public void setUtenteAggiornamento(String utenteAggiornamento)
    {
        this.utenteAggiornamento = utenteAggiornamento;
    }

	/**
	 * @return the id
	 */
	public Long getId() {
		return id;
	}

	/**
	 * @param id the id to set
	 */
	public void setId(Long id) {
		this.id = id;
	}


}
